В распределенной системе, бизнес логика будет охватывать несколько микросервисов со своими БД. В данной ситуации возникает потребность в возможности отката изменений сразу в нескольких БД с сохранением атомарности операций для согласованности БД.
Существует ряд решений этой задачи отличающиеся по уровню сложности и масштабируемости
В данном подходе каждый из микросервисов А и Б является отдельной библиотекой, которые устанавливаются в общее пространство и имеют доступ к одной и той же бд.
Поскольку они находятся в одном пространстве и используют одну бд, они могут выполнять обработку в рамках одной и той же транзакции.
Для обеспечения одной транзакции можно сделать для них один общий класс дающий возможность работать с БД.
Более того существует возможность полностью разделить два этих сервиса, даже в рамках одного монолита. Они могут смотреть на разные схемы, быть в разных пакетах, поддерживаться разными командами.
Плюсы Модульного монолита:
Минусы Модульного монолита:
Технические требования для имплементации 2PC:
Алгоритм работы двухфазного коммита:
Плюсы 2PC
Минусы 2PC
Паттерн сага подразумевает формирование некой Саги которая будет включать в себя несколько действий на разных сервисах. В рамках неё каждый из микросервисов должен реализовать эндпоинт выполнения какого-то действия, а также эндпоинт отката этого действия.
В рамках паттерна подразумевается использование оркестратора, который бы имел эндпоинт выполнения саги и который бы производил последовательные выполнения элементов саги и откат в случае ошибки на одном из них
Оркестратор использует свою бд для хранения состояния изменений и он ответственен за восстановление при любом падении в процессе изменения состояния.
У нас есть сервис А, который выступает как оркестратор, он вызывает сервис Б и восстанавливается от падений с помощью компенсаторной операции при необходимости.
Ключевым моментом является то, что оба сервиса работают в своих локальных транзакциях
В данном случае запрос от сервиса А к сервису Б будет выполнен в рамках транзакции.
Сервисы участники данного паттерна должны предоставлять идемпотентные операции, поскольку возможно выполнение ретраев, также они должны предоставлять эндпоинты для отката транзакций, чтобы сохранять согласованность данных.
Плюсы Оркестрации:
подразумевает что каждый из микросервисов должен генерировать события в некий брокер сообщений при начале выполнения некоторого действия или ошибках, а остальные должны реагировать соответствующим образом на полученные события.
При работе хореографии встает логичный вопрос, а что делать сервису, сначала коммитить а потом слать сообщение или наоборот?
Одним из возможных решений является запись в рамках одной транзакции в бд и никуда не отправлять сообщение.
Пример - Сервис А сохраняет запрос и пишет в бд А. Сервис Б периодически опрашивает Сервис А и находит изменения, при обнаружении изменений Сервис Б обновляет свою бд.
Важнейшей частью данного подхода является то, что оба сервиса выполняют запись в свои бд в рамках локальных транзакций.
Плюсы Хореографии
Предыдущие паттерны предлагают нам последовательную обработку входящего запроса, однако возможна ситуация когда один и тот же запрос должен обрабатываться разными сервисами параллельно.
Данный паттерн подразумевает возможность параллельно обрабатывать запросы, когда между сервисом А и сервисом Б нет прямой зависимости.
Добавляется сервис router, который будет посылать сообщения в оба сервиса в рамках одной транзакции.
Существует реализация параллельного пайплайна Listen to yourself . В рамках него один из сервисов слушает клиента и кладет сообщения в очередь, откуда читает как он сам так и другие сервисы пайплайна
Плюсы Parallel Pipelines:
Нет единого подхода для решения проблемы распределенных транзакций.
Каждый паттерн имеет свои достоинства и недостатки, решая свою конкретную проблему.